﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace VeryCodes.Controls.Form
{
    public partial class CustomNumericUpDown : NumericUpDown
    {
        private int m_MaxLength = 3;
        private TextBox editTextBox;

        public CustomNumericUpDown()
        {
            
        }

        /// <summary>
        /// 重写TextBox的TextChanged事件，在其中重新设置Text的值
        /// </summary>
        /// <param name="source"></param>
        /// <param name="e"></param>
        protected override void OnTextBoxTextChanged(object source, EventArgs e)
        {
            //执行base方法
            base.OnTextBoxTextChanged(source, e);

            //Value的值
            decimal dcl;
            //TextBox的文本
            string m_Text;

            //获取TextBox
            editTextBox = (TextBox)base.Controls[1];
            //获取鼠标位置
            int cusPos = editTextBox.SelectionStart;
            //获取文本框中的文本
            m_Text = editTextBox.Text;

            //如果输入的长度大于等于允许的最大长度，截取指定的长度
            if (m_Text.Length >= m_MaxLength)
            {
                //如果文本可以转换为decimal
                if (Decimal.TryParse(m_Text, out dcl) == true)
                {
                    //截取字符串,如果是负数，需要考虑负号
                    if (dcl < 0)
                    {
                        m_MaxLength += 1;
                    }

                    m_MaxLength = (m_MaxLength > m_Text.Length ? m_Text.Length : m_MaxLength);

                    m_Text = m_Text.Substring(0, m_MaxLength);

                    dcl = Convert.ToDecimal(m_Text);

                    //如果截取到的值大于最大值，则设为为最大值
                    if (dcl > this.Maximum)
                    {
                        m_Text = this.Maximum.ToString();
                    }

                    //如果截取到的值小于最小值，并且这个值小于0
                    if (dcl < 0 && dcl < this.Minimum)
                    {
                        m_Text = this.Minimum.ToString();
                    }

                    //设置Value
                    base.Value = Convert.ToDecimal(m_Text);
                    //更新文本并显示
                    UpdateTextBoxText(cusPos, m_Text);
                }
            }
        }

        /// <summary>
        /// update the text of the text box
        /// </summary>
        /// <param name="cusPos"></param>
        /// <param name="m_Text"></param>
        private void UpdateTextBoxText(int cusPos, string m_Text)
        {
            editTextBox.Text = m_Text;
            editTextBox.SelectionStart = cusPos;
            editTextBox.Update();
        }

        /// <summary>
        /// 允许输入数字最大位数
        /// </summary>
        [Description("允许输入数字最大位数")]
        [Category("CustomNumericUpDown")]
        [DefaultValue(4)]
        public int MaxLength
        {
            get
            {
                return m_MaxLength;
            }

            set
            {
                m_MaxLength = value;
            }
        }

        /// <summary>
        /// 获取文本框中的文本
        /// </summary>
        [Description("获取文本框中的文本")]
        [Category("CustomNumericUpDown")]
        [DefaultValue(4)]
        public string TextBoxText
        {
            get
            {
                editTextBox = (TextBox)base.Controls[1];
                return editTextBox.Text;
            }
        }
        
    }
}
